/**   
* @Title: CustomizedRepository.java
* @Package org.xaoyaoyao.cloud.jpa.repository
* @Description: TODO
* @author xaoyaoyao
* @date Feb 12, 2019 8:47:16 AM
* @version V1.0   
*/
package org.xaoyaoyao.cloud.jpa.repository;

import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.NoRepositoryBean;

/**
 * @ClassName: CustomizedRepository
 * @Description: TODO
 * @author xaoyaoyao
 * @date Feb 12, 2019 8:47:16 AM
 * 
 */
@NoRepositoryBean
public interface CustomizedRepository<T, ID extends Serializable> extends JpaRepository<T, ID>, JpaSpecificationExecutor<T> {

	/**
	 * @Title: saveBatch
	 * @Description: 批量写入
	 * @param entities
	 * @return List<T>
	 */
	List<T> saveBatch(List<T> entities);

	/**
	 * @Title: update
	 * @Description: 对象更新
	 * @param entity
	 * @return T
	 */
	T update(T entity);

	/**
	 * @Title: updateSelective
	 * @Description: 更新某个属性
	 * @param entity
	 *            实体对象
	 * @param id
	 *            ID值
	 * @return T
	 */
	T updateSelective(T entity, ID id);

	/**
	 * @Title: updateBatch
	 * @Description: 批量更新
	 * @param entities
	 * @return void
	 */
	void updateBatch(List<T> entities);

	/**
	 * @Title: listBySQL
	 * @Description: 传入SQL查询语句 返回结果集
	 * @param sql语句
	 * @return List<Object[]> 数据集 Object[] 结果根据sql 映射的顺
	 */
	List<Object[]> listBySQL(String sql);

	/**
	 * @Title: store
	 * @Description: 保存对象，注意：如果对象id是字符串，并且没有赋值，该方法将自动设置为uuid值
	 * @param item
	 *            持久对象，或者对象集合
	 * @return void
	 */
	void store(Object... item);

	/**
	 * @Title: update
	 * @Description: 更新对象数据
	 * @param item
	 *            持久对象，或者对象集合
	 * @return void
	 */
	void update(Object... item);
	
	/**
	 * @Title: updateByPrimaryKey
	 * @Description: 根据PrimaryKey更新数据，对象中必须PrimaryKey必须非空，即实体类注解的时候必须要有@Id
	 * @param entity
	 * @return int
	 */
	int updateByPrimaryKey(Object entity);

	/**
	 * @Title: updateSelective
	 * @Description: 只更新非空数据
	 * @param entity
	 *            属性
	 * @param primaryKeyVal
	 *            主键值
	 * @return int
	 */
	int updateSelective(Object entity, Object primaryKeyVal);

	/**
	 * @Title: update
	 * @Description: 更新
	 * @param setEntity
	 * @param whereEntity
	 * @return int
	 */
	int update(Object setEntity, Object whereEntity);

	/**
	 * @Title: executeUpdate
	 * @Description: 执行ql语句
	 * @param qlString
	 *            qlString 基于jpa标准的ql语句
	 * @param values
	 *            ql中的?参数值,单个参数值或者多个参数值
	 * @return int 返回执行后受影响的数据个数
	 */
	int executeUpdate(String qlString, Object... values);

	/**
	 * @Title: executeUpdate
	 * @Description: 执行ql语句
	 * @param qlString
	 *            基于jpa标准的ql语句
	 * @param params
	 *            key表示ql中参数变量名，value表示该参数变量值
	 * @return int 返回执行后受影响的数据个数
	 */
	int executeUpdate(String qlString, Map<String, Object> params);

	/**
	 * @Title: executeUpdate
	 * @Description: 执行ql语句，可以是更新或者删除操作
	 * @param qlString
	 *            基于jpa标准的ql语句
	 * @param values
	 *            参数值
	 * @return int 返回执行后受影响的数据个数
	 */
	int executeUpdate(String qlString, List<Object> values);

	/**
	 * @Title: sqlQuery
	 * @Description: 查询分页的方法. 带着条件进行动态拼接sql的查询方法
	 * @param queryString
	 *            sql语言
	 * @param countSql
	 *            总数sql语言
	 * @param values
	 *            参数值
	 * @param offset
	 *            页数
	 * @param limit
	 *            条数
	 * @param countName
	 *            总结果数
	 * @param rowsName
	 *            结果集
	 * @return HashMap<String,Object>
	 */
	HashMap<String, Object> sqlQuery(String queryString, String countSql, Map<String, ?> values, int offset, int limit, String countName, String rowsName);

	/**
	 * @Title: sqlQuery
	 * @Description: 查询
	 * @param queryString
	 *            sql语言
	 * @param values
	 *            参数值
	 * @return List<T>
	 */
	List<T> sqlQuery(String queryString, Map<String, ?> values);

	/**
	 * @Title: sqlQuery
	 * @Description: 查询
	 * @param queryString
	 *            sql语言
	 * @param values
	 *            参数值
	 * @return List<T>
	 */
	List<T> sqlQuery(String queryString, Object... values);

	/**
	 * @Title: retrieve
	 * @Description: 分页查询
	 * @param queryString
	 *            sql语言
	 * @param countSql
	 *            总数sql语言
	 * @param values
	 *            参数值
	 * @param offset
	 *            页数
	 * @param limit
	 *            条数
	 * @param countName
	 *            总结果数
	 * @param rowsName
	 *            结果集
	 * @return HashMap<String,Object>
	 */
	HashMap<String, Object> retrieve(String queryString, String countSql, Map<String, ?> values, int offset, int limit, String countName, String rowsName);

}
